#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <stdio.h>

/*
 * 2016 20:42 通过调用wait安排父进程结束在子进程结束之后。
 */

//pid_t wait(int * stat_loc);

int main()
{
  pid_t pid;
  char * message;
  int n;
  int exit_code;

  printf("fork program starting\n");
  pid = fork();

  switch(pid) {
  case -1:
    perror("fork failed");
    exit(1);
  case 0:
    message = "This is the child";
    n = 5;
    exit_code = 37;
    break;
  default:
    message = "This is the parent";
    n = 3;
    exit_code = 0;
    break;
  }

  for (; n > 0; n--) {
    puts(message);
    sleep(1);
  }

  if (pid != 0) {
    int stat_val;
    pid_t child_pid;

    child_pid = wait(&stat_val);

    printf("Child has finished : PID = %d\n", child_pid);
    if (WIFEXITED(stat_val))
      printf("Child exited with code %d\n", WEXITSTATUS(stat_val));
    else
      printf("Child terminated abnormally\n");
  }

  exit(exit_code);
}
